package TpFinal;

import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Random;

public class Auto extends Thread {

	private Celda posicionActual;
	private String identificador;
	private int velocidad;
	private Calle calle;
	private Queue<Celda> camino = new ArrayDeque<Celda>();
	
	public Auto(String nombre, Calle calleOrigen, Interseccion interseccion, Calle calleDestino){
		this.identificador = nombre + " " + "de " + calleOrigen.getNombre();
		this.velocidad = (new Random().nextInt(3)+1)*1000;
		this.posicionActual = calleOrigen.IniciarRecorrido(this);
		this.camino = this.obtenerCamino(calleOrigen,interseccion,calleDestino);
	}
	
	/**
	 * Devuelve el camino a recorrer pidiendo a cada parte del recorrido que valla agregando
	 * al camino cada una de las celdas correspondientes
	 * 
	 * @param calleOrigen
	 * @param interseccion
	 * @param calleDestino
	 * @return Queue<Celda> 
	 */
	private Queue<Celda> obtenerCamino(Calle calleOrigen,Interseccion interseccion, Calle calleDestino) {
		Queue<Celda> camino = new ArrayDeque<Celda>();
		calleOrigen.indicarCaminoEntrada(camino);
		interseccion.indicarCamino(camino, calleOrigen.getDireccion(), calleDestino.getDireccion());
		calleDestino.indicarCaminoSalida(camino);
		return camino;
	}

	/**
	 * mientras que tenga un camino por recorrer toma la siguiente celda a posicionarse
	 * y deja la celda en la cual estaba. duerme el tiempo que tenga definido como velocidad
	 */
	public void run(){
		System.out.println("el "+this.getIdentificador()+" esta en la posicion "+this.getPosicionActual());
		while(!this.getCamino().isEmpty()){
			Celda celda = this.getCamino().poll();
			celda.posicionarse(this);
			this.getPosicionActual().dejarPosicion();
			this.setPosicionActual(celda);
			try {
				System.out.println("el "+this.getIdentificador()+" esta en la posicion "+this.getPosicionActual());
				Thread.sleep(this.getVelocidad());
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.getPosicionActual().dejarPosicion();
		System.out.println("el "+this.getIdentificador()+" termino su recorrido");
		
	}
	
	
	//Getters & Setter
	public Celda getPosicionActual() {
		return posicionActual;
	}
	public void setPosicionActual(Celda posicionActual) {
		this.posicionActual = posicionActual;
	}
	public String getIdentificador() {
		return identificador;
	}
	public void setIdentificador(String identificador) {
		this.identificador = identificador;
	}
	public int getVelocidad() {
		return velocidad;
	}
	public void setVelocidad(int velocidad) {
		this.velocidad = velocidad;
	}
	public Calle getCalle() {
		return calle;
	}
	public void setCalle(Calle calle) {
		this.calle = calle;
	}
	public Queue<Celda> getCamino() {
		return camino;
	}
	public void setCamino(Queue<Celda> camino) {
		this.camino = camino;
	}
}
